% !Mode:: "TeX:UTF-8"

\chapter{项目特色}
\section{面向对象设计原则的体现}
项目中的代码设计遵循了面向对象设计原则，具体体现在以下几个方面：
\begin{itemize}
    \item 面向接口而非实现编程
    
    上游系统面向接口而非实现编程,不依赖不稳定的实现细节,这样当实现发生变化的时候,上游系统的代码基本上不需要做改动,以此来降低耦合性,提高扩展性。 例如CreditController在调用Service层时，调用的是CreditService这个实现类，而非具体的实现类。
    \item 高内聚、松耦合
    
    例如在CreditImpl类中，要实现优先消费临近过期的积分这一功能。我们选择将这一功能的实现委托给CreditList来实现，CreditImpl只需调用CreditList的方法即可。
    \item LoD 迪米特法则，又称 LKP 最少知识原则
    
    迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP),虽然名字不同,但描述的是同一个规则:一个对象应该对其他对象有最少的了解。项目中代码分层实现、Service层委托实体类来实现、使用充血模型而非贫血模型，这些都体现了这一原则。
    \item DRY 原则
    
    DRY原则:Don’t Repeat Yourselt, 简称DRY。例如在实现过程中需要多次对解析表示时间的String，并且对时间进行比较等操作，我们将这些重复的代码写到了util.CommonUtil中，提高代码的可复用性。
    \item 封装特性
    
    在项目设计中采用充血模型，实体对象层po层中的virtualwallet类和bvirtualwallet类中既有数据又有逻辑操作函数，使数据和对应的业务逻辑被封装到同一个类中，是典型的面向对象编程风格，充分体现了面向对象的封装特性。
    \item 依赖倒置原则
    
    在项目设计中程序依赖于抽象接口，不要依赖于具体实现。Service层中有接口和实现类，Controller层调用service层的接口，对抽象进行编程。让用户程序依赖于抽象，实现的细节也依赖于抽象，这样就降低了客户与实现模块间的耦合性。

    \item 单一职责原则
    
    就一个类而言，应该仅有一个引起它变化的原因。一个对象应该只包含单一的职责，并且该职责被完整地封装在一个类中。例如：实现了逻辑和界面的分离。Mapper层负责与数据库交互，在Mapper层中的每一个类中只涉及到对一个数据库表的增删改查。
\end{itemize}

\section{其他项目特色}
\begin{itemize}
    \item 代码分层（横向切分）
        大部分业务系统的开发都可以分为三层：Contoller 层、Service 层、Mapper层。其中 Controller 用来与前端用户界面交互，Service 层用来处理业务逻辑，Mapper层用来与数据库交互。这样做的好处是：
 
        分层能起到代码复用的作用
 
        分层能起到隔离变化的作用
 
        分层能起到隔离关注点的作用
 
        分层能提高代码的可测试性
 
        分层能应对系统的复杂性

    \item RESTful风格的接口设计
    
    设计了RESTful风格的接口。 RESTfulAPI中，URL中只使用名词来指定资源，原则上不使用动词。多人协作时，统一风格，可提高沟通效率。

    \item 使用充血模型
    
    项目设计使用充血模型，在 po 层的实体对象类中加入特定的业务逻辑函数，使数据和对应的业务逻辑被封装到同一个类中，这种充血模型满足面向对象的封装特性，是典型的面向对象编程风格。

    \item Spring Could架构特色
    
    (1) 服务注册与发现：本项目使用 Eureka 作为服务注册中心，使用 Spring Cloud Netflix Eureka Client 进行服务的注册和发现。通过这种方式，各个微服务之间可以相互发现和调用，从而实现了分布式系统中服务的动态发现和管理。

    (2) 负载均衡和容错处理：本项目使用 Ribbon 和 Feign 进行负载均衡和容错处理。通过使用这些组件，可以实现请求的负载均衡和容错处理，从而提高了系统的可用性和可靠性。

    (3) 配置管理：本项目使用 Spring Cloud Config 组件集中管理分布式系统的配置文件，将配置文件存储在配置中心，然后在应用程序启动时从配置中心读取配置。这样可以方便地管理应用程序的配置，并且可以在配置变更时自动刷新应用程序的配置，从而提高系统的可维护性。

    (4) API 网关：本项目使用 Spring Cloud Gateway 构建了一个 API 网关，将多个微服务的 API 统一管理和暴露，从而简化客户端的调用。同时，API 网关还实现了统一的认证和安全控制，提高了系统的安全性。

    (5) 分布式事务：本项目使用 Spring Cloud Bus 和 Spring Cloud Sleuth 实现了分布式事务的处理和跟踪。通过使用这些组件，可以实现分布式事务的一致性和可靠性，同时也可以实现更高效的跟踪和日志管理。


这些特色使得本项目具有良好的可用性、可维护性和可扩展性，能够满足复杂分布式系统的需求。同时，这些特色也能够帮助我们更高效地构建和管理分布式系统。

\end{itemize}